package com.speily.spring.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Auther: SPL
 * @Date: 2019-05-30 14:45
 * @Description: 动态代理实现原理
 */
public class DynaProxyTest implements InvocationHandler{

    private Object target;


    /**
     * 通过反射构造目标对象，并赋值给其内部变量Object对象
     * @param o 目标对象
     * @return
     */
    public Object bulidTarget(Object o){
        this.target = o;
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(), this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result;
        System.out.println("before: do something");//添加额外的方法(增强了被代理对象方法)
        //通过反射机制来运行目标对象的方法
        result = method.invoke(this.target, args);
        System.out.println("after: do something");
        return result;
    }
}
